﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2010-06-30
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
// 调用JAVA打开网页界面的C++端示例代码
//    （一个字符参数，无返回值）
// extern bool FJniWebOpen(const ACHAR* url)
// {
//     FDT_VALUE ret;             // 返回值（默认VOID）
//     FV_DT_VALUE param;         // 参数列表（无参则不push_back）
//     param.push_back(FDT_VALUE(eFDT_pachar));
// 
//     FStringA paramCode;        // 生成JNI调用字符串
//     FJaveMakeParameterCode(paramCode, ret, param);
// 
//     FJAVA_METHOD jmc;          // 查询指定的JAVA静态函数地址
//     if (FGetJavaStaticFunction(jmc, FJniClassName(), "fromNativeWebOpen", paramCode))
//     {
//         jstring vtxt;
//         FUTF8ToJavaString(url, vtxt);// 字符串参数转为JAVA字符串，其它如bool类型可直接传入，JAVA中没有无符号数据概念
// 
//         jmc.env->CallStaticVoidMethod(jmc.classID, jmc.methodID, vtxt);    // 调用该静态函数
//         jmc.env->DeleteLocalRef(jmc.classID);
//         return true;
//     }
//     return false;
// }
//----------------------------------------------------------------
#pragma once

#if FUEL_OS_ANDROID

typedef void (FCALL *FJniEventInput)(const ACHAR* edit_ok, int id1, int id2);
typedef void (FCALL *FJniEventWebJump)(const ACHAR* dest_url);

struct FJNI_EVENT
{
	FJniEventInput evt_input;
	FJniEventWebJump evt_web_jimp;

	FJNI_EVENT()
		:evt_input(0)
		,evt_web_jimp(0)
	{}
};

extern "C"
{
    struct FJAVA_METHOD
    {
        JNIEnv*	env;
        jclass classID;
        jmethodID methodID;
    };

    // 获取JNI虚拟机
    extern JavaVM* FJniVM();
    // 获取JNI环境
    extern JNIEnv* FJniEnv();
    // 获取APK包
    extern jobject FJniAssetsManager();
    // 获取JNI版本（JNI_VERSION_1_6或者更低）
    extern jint FJniVeraion();
    // 初始化（自动调用）
    extern void FJniInit(jobject assets, const ACHAR* cls_name);
    // 获取JNI事件管理器
    extern FJNI_EVENT& FJniGetEvent();
    // 获取JNI中Activity类名
    extern const ACHAR* FJniClassName();

    // 查询JAVA中某个类的成员函数
    extern bool FGetJavaFunction(FJAVA_METHOD& jm, const char* className, const char* methodName, const char* paramCode);
    // 查询JAVA中某个类的静态函数
    extern bool FGetJavaStaticFunction(FJAVA_METHOD& jm, const char* className, const char* methodName, const char* paramCode);
    // JAVA字符串转普通UTF8字符串
    extern bool FJavaStringToUTF8(jstring jstr, FStringA& ret);
    // 普通UTF8字符串转JAVA字符串
    extern bool FUTF8ToJavaString(const ACHAR* str, jstring& jstr);
    // 从指定的参数与返回值类型，转换为JAVA参数串
    extern void FJaveMakeParameterCode(FStringA& paramCode, FDT_VALUE& ret, FV_DT_VALUE& param);

    // 调用主Activity中的无参无返回值静态函数
    extern bool FJniCallVoidFunction(const ACHAR* funcname);

    // 打开安卓输入法及输入框
    //    接收相关输入结果请调用FJniGetEvent()设置evt_input回调参数
    // .default_txt 默认显示文本
    // .multi_line 是否多行编辑框
    // .mode 编辑模式，1表示数字，2英文数字混合密码，3数字密码，4电话号码，其它默认中英混合文本
    // .id1, id2 为使用者自定义参数，当输入结束后，回传给使用者，引擎不处理这些值
    // .return 返回是否调用JNI成功
    extern bool FJniInputOpen(const ACHAR* default_txt, bool multi_line, int mode, int id1, int id2);
    // 主动关闭输入法
    extern void FJniInputClose();
    // 打开安卓网页显示界面
    //    如果需拦截网页跳转请调用FJniGetEvent()设置evt_web_jimp回调参数
    // .url 打开的网页链接
    // .return 返回是否调用JNI成功
    extern bool FJniWebOpen(const ACHAR* url);
    // 关闭网页显示界面
    extern void FJniWebClose();
};

#endif
